<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>HomeObject</title>
</head>
<body>
<script>

  /*
  * 我们已经知道了使用super调用父类方法其实不是简单的使用this.__proto__
  * 其实在背后起作用的是[[HomeObject]]这个隐藏属性
  * 当一个函数被定义为类或者对象方法时，它的 [[HomeObject]] 属性就成为了该对象。然后 super 使用它来解析（resolve）父原型及其方法
  * 简单的来说就是super使用的是[[HomeObject]].__proto__
  * 因为[[HomeObject]]可以记住函数当前的对象 不会像this那样会被修改
  *
  * */

  class User {
    name ='A'
    get1(){
      console.log(this.name);
      console.log(1);
    }
  }

  class Boy extends User{
    name ='B'

    /*
    * 这个方法不管交给哪个变量进行调用 里面的super都只会访问Boy的父类 而不会动态的变成调用者的父类
    *
    * 所以有super的函数不适合被其他对象调用
    * */
    get2(){
    /*
    * 只有使用super调用方法才会使用[[HomeObject]]
    *
    * */
      super.get1()//[[HomeObject]].__proto__.get1.call(this)

      console.log(this.name);
    }
  }

  /*
  * 如果一个方法中有super的话，那么它不适合被传递 因为方法中的super只会记得方法被定义的那个对象而不会动态
  *
  * */

  let a ={
    get1(){
      console.log(2);

    }
  }

  let b ={
    __proto__: a,
    get: new Boy().get2
  }

  b.get()


</script>
</body>
</html>